package com.example.thegreatwall.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;

/**
 * jwt工具类
 */
public class JwtUtil {

    private static final String SECRET = "MySuperSecretKeyForJWTWhichIsVerySecret123!"; // 建议放配置文件
    private static final Key key = Keys.hmacShaKeyFor(SECRET.getBytes());

    /**
     * 生成 JWT Token
     */
    public static String generateToken(String openid) {
        return Jwts.builder()
                .setSubject(openid)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000)) // 7 天
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 解析 Token 获取 Claims
     */
    public static Claims parseToken(String token) throws JwtException {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 验证 Token 是否有效
     */
    public static boolean isTokenValid(String token) {
        try {
            Claims claims = parseToken(token);
            Date expiration = claims.getExpiration();
            return expiration.after(new Date());
        } catch (JwtException e) {
            return false;
        }
    }

    /**
     * 从 Token 中提取 openid
     */
    public static String getOpenidFromToken(String token) {
        try {
            return parseToken(token).getSubject();
        } catch (JwtException e) {
            return null;
        }
    }

    /**
     * 从 token 中解析出 userId
     */
    public Long getUserIdFromToken(String token) {
        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();

            // userId 一般以 Long 存储在 claims 中
            return claims.get("userId", Long.class);
        } catch (JwtException | IllegalArgumentException e) {
            // token 无效或已过期
            return null;
        }
    }
}
